﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TISModel;
using BTO;
using DAL;
using Exceptions;

namespace BLL
{
    public class BLLAlojamento
    {
        public List<BTO.Alojamento> list()
        {
            DALAlojamento alojamentos = new DALAlojamento();
            List<BTO.Alojamento> toReturn = alojamentos.list();
            if (toReturn.Count() == 0)
            {
                throw new NotFoundAlojamentoException("Nao existem alojamentos registados.");
            }
            return toReturn;
        }

        public BTO.Alojamento getByID(int? id)
        {
            DALAlojamento dalAlojamento = new DALAlojamento();
            BTO.Alojamento btoAlojamento = dalAlojamento.getByID(id);

            if (btoAlojamento == null) {
                throw new NotFoundAlojamentoException("Alojamento não encontrado!");
            }

            return btoAlojamento;
        }

        public BTO.Alojamento getByNome(string nomeAlojamento) {
            DALAlojamento dalAlojamento = new DALAlojamento();
            BTO.Alojamento btoAlojamento = dalAlojamento.getByNome(nomeAlojamento);

            if (btoAlojamento == null) {
                throw new NotFoundAlojamentoException("Alojamento não encontrado!");
            }

            return btoAlojamento;
        }

        public List<BTO.Alojamento> getByIDLocal(int idLocal)
        {
            DALAlojamento alojamentos = new DALAlojamento();
            List<BTO.Alojamento> btoAlojamentos = alojamentos.getByIDLocal(idLocal);
            
            if (btoAlojamentos.Count() == 0)
                throw new NotFoundTipoAlojamentoException("Não existem alojamentos neste local!");

            return btoAlojamentos;
        }

        public List<BTO.Alojamento> getByTipoAlojamento(int tipoAlojamento)
        {
            DALAlojamento alojamentos = new DALAlojamento();
            List<BTO.Alojamento> btoAlojamentos = alojamentos.getByTipoAlojamento(tipoAlojamento);
            
            
            if (btoAlojamentos.Count()==0)
                throw new NotFoundTipoAlojamentoException("Não existem alojamentos deste tipo!");

            return btoAlojamentos;
        }

        public List<BTO.Alojamento> getByCategoria(int idAlojamento)
        {
            DALAlojamento alojamentos = new DALAlojamento();
            List<BTO.Alojamento> btoAlojamentos = alojamentos.getByCategoria(idAlojamento);

            if (btoAlojamentos.Count() == 0)
                throw new NotFoundAlojamentoException("Não existem alojamentos desta categoria!");

            return btoAlojamentos;
        }


        public void insert(BTO.Alojamento toInsert)
        {
            DALAlojamento dalAlojamento = new DALAlojamento();
            BTO.Alojamento btoAlojamento;

            btoAlojamento = dalAlojamento.getByNome(toInsert.nome);

            if (btoAlojamento != null) {
                throw new FoundAlojamentoNomeException("Alojamento já existente!");
            }

            DALCategoria dalCategoria = new DALCategoria();
            BTO.Categoria btoCategoria;
            btoCategoria = dalCategoria.getByID(toInsert.IDCategoria);
            if (btoCategoria == null) { throw new NotFoundCategoriaException("Categoria não encontrada!"); }

            DALTipoAlojamento dalTipoAlojamento = new DALTipoAlojamento();
            BTO.TipoAlojamento btoTipoAlojamento;
            btoTipoAlojamento = dalTipoAlojamento.getByID(toInsert.IDTipoAlojamento);
            if (btoTipoAlojamento == null) { throw new NotFoundTipoAlojamentoException("Tipo de alojamento nao encontrado!"); }

            DALLocal dalLocal = new DALLocal();
            BTO.Local btoLocal;
            btoLocal = dalLocal.getByID(toInsert.IDLocal);
            if (btoLocal == null) { throw new NotFoundLocalException("Local nao encontrado!"); }

            try
            {
                dalAlojamento.insert(toInsert);
            }
            catch (Exception e)
            {
                throw new InsertAlojamentoException(e.Message);
            }
        }

        public void update(BTO.Alojamento toUpdate)
        {
            DALAlojamento dalAlojamento = new DALAlojamento();
            BTO.Alojamento btoAlojamento;

            btoAlojamento = dalAlojamento.getByNome(toUpdate.nome);
            if (btoAlojamento != null && btoAlojamento.IDAlojamento != toUpdate.IDAlojamento)
            {
                throw new IDAlojamentoException("Já existe um alojamento com o nome indicado!");
            }

            DALCategoria dalCategoria = new DALCategoria();
            BTO.Categoria btoCategoria;
            btoCategoria = dalCategoria.getByID(toUpdate.IDCategoria);
            if (btoCategoria == null) { throw new NotFoundCategoriaException("Categoria não encontrada!"); }

            DALTipoAlojamento dalTipoAlojamento = new DALTipoAlojamento();
            BTO.TipoAlojamento btoTipoAlojamento;
            btoTipoAlojamento = dalTipoAlojamento.getByID(toUpdate.IDTipoAlojamento);
            if (btoTipoAlojamento == null) { throw new NotFoundTipoAlojamentoException("Tipo de alojamento nao encontrado!"); }

            DALLocal dalLocal = new DALLocal();
            BTO.Local btoLocal;
            btoLocal = dalLocal.getByID(toUpdate.IDLocal);
            if (btoLocal == null) { throw new NotFoundLocalException("Local nao encontrado!"); }

            try
            {
                dalAlojamento.update(toUpdate);
            }
            catch (Exception e)
            {
                throw new UpdateAlojamentoException(e.Message);
            }
        }

        public void delete(int id)
        {
            DALAlojamento dalAlojamento = new DALAlojamento();
           
            try
            {
                dalAlojamento.delete(id);
            }
            catch (Exception e)
            {
                throw new DeleteAlojamentoException(e.Message);
            }

        }
    }
}
